﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotas.Core;

namespace GestorDeFlotasDesktop.AbmRol
{
    public partial class DatosRol : FormDatosBase
    {
        private Rol MyRol { get; set; }

        public DatosRol(ModoAbm modoAbm)
            : base(modoAbm)
        {
            InitializeComponent();
        }

        public DatosRol(ModoAbm modoAbm, Rol rol)
            : this(modoAbm)
        {
            MyRol = rol;
        }

        private void DatosRol_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'gD1C2012DataSet.TL_Funcionalidades' table. You can move, or remove it, as needed.
            this.tL_FuncionalidadesTableAdapter.Fill(this.gD1C2012DataSet.TL_Funcionalidades);
            this.SetFormText();

            if (this.modoAbm == ModoAbm.Alta)
            {
                this.MyRol = new Rol();
                this.chkActivo.Enabled = false;
            }
            else if (this.modoAbm == ModoAbm.Modificacion)
            {
                PopularControles(this.MyRol);
            }            
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            List<string> camposInvalidos = ChequearCamposObligatorios();
            if (!(camposInvalidos.Count > 0))
            {
                PopularRol();
                if (this.modoAbm == ModoAbm.Alta)
                {
                    MyRol.Crear();   
                }
                else if (this.modoAbm == ModoAbm.Modificacion)
                {
                    MyRol.Modificar();
                }

                this.DialogResult = DialogResult.OK;
            }
            else
            {
                MostrarMensajeCamposObligatorios(camposInvalidos);
            }
        }

        private void PopularControles(Rol rol)
        {
            this.txtNombre.Text = rol.Nombre;
            this.chkActivo.Checked = rol.Activo;
            PopularFuncionalidades(rol.Funcionalidades);
        }

        private void PopularFuncionalidades(List<int> idsFuncionalidades)
        {
            foreach (DataGridViewRow row in grdFuncionalidades.Rows)
            {
                if (idsFuncionalidades.Contains((Int32)row.Cells["fun_codigo"].Value))
                {
                    row.Cells["fun_seleccionado"].Value = true;
                }
            }
        }

        private void PopularRol()
        {
            MyRol.Nombre = this.txtNombre.Text;
            MyRol.Activo = this.chkActivo.Checked;
            MyRol.Funcionalidades.Clear();

            List<DataGridViewRow> checkedRows = GetFuncionalidadesSeleccionadas();
            if (checkedRows.Count > 0)
            {
                MyRol.Funcionalidades.AddRange(checkedRows.Select(r => Convert.ToInt32(r.Cells["fun_codigo"].Value)).ToList());
            }
        }

        private List<DataGridViewRow> GetFuncionalidadesSeleccionadas()
        {
            List<DataGridViewRow> checkedRows = new List<DataGridViewRow>();
            foreach (DataGridViewRow row in grdFuncionalidades.Rows)
            {
                if (Convert.ToBoolean(row.Cells["fun_seleccionado"].Value) == true)
                {
                    checkedRows.Add(row);
                }
            }
            return checkedRows;
        }

        private List<string> ChequearCamposObligatorios()
        {
            List<string> camposInvalidos = new List<string>();
            if (string.IsNullOrEmpty(this.txtNombre.Text))
            {
                camposInvalidos.Add("Nombre");
            }

            return camposInvalidos;
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.txtNombre.Text = string.Empty;
            LimpiarFuncionalidadesSeleccionadas();
        }

        private void LimpiarFuncionalidadesSeleccionadas()
        {
            foreach (DataGridViewRow row in grdFuncionalidades.Rows)
            {
                if (Convert.ToBoolean(row.Cells["fun_seleccionado"].Value) == true)
                {
                    row.Cells["fun_seleccionado"].Value = false;
                }
            }
        }
    }
}
